package com.zy.springcloud.alibaba.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.zy.springcloud.alibaba.service.PaymentService;
import com.zy.springcloud.entities.CommonResult;
import com.zy.springcloud.entities.Payment;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

@RestController
public class CircleBreakerController {
    private static final String PAYMENT_URL="http://nacos-payment-provider";
//    @Value("${service-url.nacos-user-service}")
//    private String service_URL;
    @Resource
    private RestTemplate restTemplate;

    @RequestMapping("/consumer/fallback/{id}")
//    @SentinelResource(value = "fallback")//没有配置
//    @SentinelResource(value = "fallback",fallback = "handlerFallback")//fallback 只负责业务异常
//    @SentinelResource(value = "fallback",blockHandler = "blockHandler")//blockHandler只负责控制台sentinel的违规操作
    @SentinelResource(value = "fallback",fallback = "fallback",blockHandler="blockHandler",
                        exceptionsToIgnore = {IllegalArgumentException.class})
    public CommonResult<Payment> fallback(@PathVariable("id") Long id){
        CommonResult<Payment> result =restTemplate.getForObject(PAYMENT_URL+"/paymentSQL/"+id,CommonResult.class);
        if (id == 4){
            throw new IllegalArgumentException("IllegalArgumentException,非法参数异常");
        }else if(result.getData() == null){
            throw new NullPointerException("NullPointerException,没有对应记录，空指针异常");
        }
        return result;
    }

//    本例是fallback
    public CommonResult handlerFallback(@PathVariable("id") Long id,Throwable e){
        Payment payment=new Payment(id,"null");
        return new CommonResult<>(444,"兜底异常，exception内容"+e.getMessage(),payment);
    }


    //本例是blockHandler
    public CommonResult blockHandler(@PathVariable("id") Long id, BlockException blockException){
        Payment payment=new Payment(id,"null");
        return new CommonResult<>(445,"block-Sentinel限流，无此流水：blockException"+blockException.getMessage(),payment);
    }




// ============openfeign
    @Resource
    private PaymentService paymentService;

    @GetMapping("/consumer/paymentSQL/{id}")
    public CommonResult<Payment> paymentSQL(@PathVariable("id")Long id){
        return paymentService.paymentSQL(id);
    }


}
